package taskrunner

import "time"

// Worker 工作
type Worker struct {
	ticker *time.Ticker // 定时器
	runner *Runner      // 任务执行器
}

// NewWorker 创建工作
func NewWorker(interval time.Duration, r *Runner) *Worker {

	return &Worker{
		ticker: time.NewTicker(interval * time.Second),
		runner: r,
	}

}

// 启动这个定时器
func (w *Worker) startWorker() {
	for {
		select {
		// w.ticker.C 是定时器每间隔多少时间就往这个 管道 发送数据，
		// 接收到数据的时候，就表示可以开始执行这个定时器
		case <-w.ticker.C:
			// 启动这个 runner 执行
			go w.runner.startAll()
		}
	}
}

// 启动这个定时任务
func Start() {

	// VidepClearDispatcher, VideoClearExecutor  在这里是函数的实现
	// 类似于 java 接口的实现类。在需要调用方法的时候，在传递函数里面的参数

	r := NewRunner(3, true, VidepClearDispatcher, VideoClearExecutor)
	w := NewWorker(3, r)
	go w.startWorker()
}
